<script>
    // const s = new Set();
    // [1, 2, 3, 4, 1, 2, 3].forEach(n => s.add(n))
    // console.log(s)

    // for (let n of s) {
    //     console.log(n)
    // }

    // class A {
    //     constructor() { this.value = 1 }
    //     fn() {
    //         // 没有上下文，this=undefined
    //         console.log('调用A的fn', this.value)
    //     }
    // }
    // const a = new A()
    // const b = a.fn
    // a.fn() // 1
    // // b() // undefined
    // a.fn.call({ value: 10 }) // 10

    // const ws = new WeakSet()
    // class A {
    //     constructor() {
    //         this.value = 1
    //         ws.add(this)
    //     }
    //     fn() {
    //         // 没有上下文，this=undefined
    //         if (ws.has(this)) {
    //             console.log('调用A的fn', this.value)
    //         } else {
    //             console.error('错误，不能给其他类型的对象用fn()')
    //         }
    //     }
    // }
    // {
    //     const a = new A()
    //     const b = a.fn
    //     a.fn() // 1
    //     // b() // undefined
    //     a.fn.call({ value: 10 }) // 10
    // }

    let vs = new WeakMap()

    function countUser(user) {
        let count = vs.get(user) || 0
        count = count + 1
        vs.set(user, count)
        return count
    }

    let user = { name: '张三' }
    let user2 = { name: '李四' }
    countUser(user)
</script>